package com.library.controller;

import com.library.dao.BookRepository;
import com.library.entity.Book;
import com.library.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * 图书控制器类，负责处理与图书相关的请求。
 * 该控制器提供了查看、添加、编辑和删除图书的功能，
 * 以及支持分类筛选和分页展示书籍、搜索书籍等功能。
 */
@Controller
@RequestMapping("bookController")
public class BookController {

    @Autowired
    private BookService bookService;

    /**
     * 辅助方法，用于对书籍列表进行分页。
     * 该方法会根据页码将书籍列表分成多个页面，并将分页信息传递给视图。
     *
     * @param page 当前页码（从1开始）。
     * @param allBooks 需要分页的完整书籍列表。
     * @param model Spring模型对象，用于向视图传递数据。
     */
    public void applyPagination(int page, List<Book> allBooks, Model model) {
        int pageSize = 10;  // 每页显示的图书数量

        // 计算总页数
        int totalBooks = allBooks.size();
        int totalPages = (int) Math.ceil(totalBooks / (double) pageSize);

        // 根据页码获取当前页的书籍
        int startIndex = (page - 1) * pageSize;
        int endIndex = Math.min(startIndex + pageSize, totalBooks);
        List<Book> books = allBooks.subList(startIndex, endIndex);

        // 将分页数据添加到模型中
        model.addAttribute("books", books);
        model.addAttribute("currentPage", page);
        model.addAttribute("totalPages", totalPages);
    }

    /**
     * 根据类别分页展示书籍。
     *
     * @param categoryName 分类名称（可选）。
     * @param page 当前页码。
     * @param model Spring模型对象，用于向视图传递数据。
     * @return 返回渲染图书列表页面的视图名称。
     */
    @GetMapping("/category")
    public String showBooksByCategory(@RequestParam(required = false) String categoryName,
                                      @RequestParam(value = "page", defaultValue = "1") int page,
                                      Model model) {
        List<Book> books = bookService.getBooksByCategory(categoryName);
        applyPagination(page, books, model);
        model.addAttribute("categoryName", categoryName != null ? categoryName : "");
        return "bookList";
    }

    /**
     * 根据类别分页展示书籍（用于编辑页面）。
     *
     * @param categoryName 分类名称（可选）。
     * @param page 当前页码。
     * @param model Spring模型对象，用于向视图传递数据。
     * @return 返回渲染图书编辑页面的视图名称。
     */
    @GetMapping("/categoryEdit")
    public String showBooksByCategoryEdit(@RequestParam(required = false) String categoryName,
                                          @RequestParam(value = "page", defaultValue = "1") int page,
                                          Model model) {
        List<Book> books = bookService.getBooksByCategory(categoryName);
        applyPagination(page, books, model);
        model.addAttribute("categoryName", categoryName != null ? categoryName : "");
        return "bookEdit";
    }

    /**
     * 根据查询条件搜索书籍，并进行分页展示。
     *
     * @param query 查询关键词。
     * @param page 当前页码。
     * @param model Spring模型对象，用于向视图传递数据。
     * @return 返回渲染图书列表页面的视图名称。
     */
    @GetMapping("/search")
    public String searchBooks(@RequestParam("query") String query,
                              @RequestParam(value = "page", defaultValue = "1") int page,
                              Model model) {
        List<Book> books = bookService.searchBooks(query);
        applyPagination(page, books, model);
        model.addAttribute("query", query);
        return "bookList";
    }

    /**
     * 根据查询条件搜索书籍，并进行分页展示（用于编辑页面）。
     *
     * @param query 查询关键词。
     * @param page 当前页码。
     * @param model Spring模型对象，用于向视图传递数据。
     * @return 返回渲染图书编辑页面的视图名称。
     */
    @GetMapping("/searchEdit")
    public String searchBooksEdit(@RequestParam("query") String query,
                                  @RequestParam(value = "page", defaultValue = "1") int page,
                                  Model model) {
        List<Book> books = bookService.searchBooks(query);
        applyPagination(page, books, model);
        model.addAttribute("query", query);
        return "bookEdit";
    }



    /**
     * 编辑图书信息。
     *
     * @param bookId 需要编辑的书籍ID。
     * @param title 新书名。
     * @param isbn 新ISBN。
     * @param author 新作者。
     * @param publisher 新出版社。
     * @param category 新分类。
     * @param totalCopies 新的总数量。
     * @param availableCopies 新的可用数量。
     * @param model Spring模型对象，用于向视图传递反馈消息。
     * @return 重定向到图书编辑页面，并附带操作结果消息。
     */
    @PostMapping("/Edit")
    public String editBook(@RequestParam("bookId") Long bookId,
                           @RequestParam("title") String title,
                           @RequestParam("isbn") String isbn,
                           @RequestParam("author") String author,
                           @RequestParam("publisher") String publisher,
                           @RequestParam("category") String category,
                           @RequestParam("totalCopies") int totalCopies,
                           @RequestParam("availableCopies") int availableCopies,
                           Model model) {

        String result = bookService.editBook(bookId, title, isbn, author, publisher, category, totalCopies, availableCopies);
        model.addAttribute("message", result);
        return "bookEdit";
    }

    /**
     * 删除图书。
     *
     * @param bookId 需要删除的书籍ID。
     * @param model Spring模型对象，用于向视图传递反馈消息。
     * @return 重定向到图书编辑页面，并附带操作结果消息。
     */
    @PostMapping("/delete")
    public String deleteBook(@RequestParam("bookId") Long bookId, Model model) {
        String result = bookService.deleteBook(bookId);
        model.addAttribute("message", result);
        return "bookEdit";
    }

    // 处理添加书籍的请求
    @PostMapping("/add")
    public String addBook(@RequestParam("title") String title,
                          @RequestParam("isbn") String isbn,
                          @RequestParam("author") String author,
                          @RequestParam("publisher") String publisher,
                          @RequestParam("category") String category,
                          @RequestParam("totalCopies") int totalCopies,
                          Model model) {

        // 创建图书对象并设置属性
        Book newBook = new Book();
        newBook.setTitle(title);
        newBook.setIsbn(isbn);
        newBook.setAuthor(author);
        newBook.setPublisher(publisher);
        newBook.setCategory(category);
        newBook.setTotalCopies(totalCopies);
        newBook.setAvailableCopies(totalCopies);

        // 调用 BookService 来保存书籍
        String result=bookService.addBook(newBook);

        // 添加成功后跳转到图书列表页面或其他页面
        model.addAttribute("message", result);
        return "bookEdit";  // 跳转到书籍列表页面
    }
}
